﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;

//class Cat
//{
//public:
//private:
//	int _leg;
//	int _mouth;
//	bool ​​_canClimbWalls = true;
//};
//class Dog
//{
//public:
//private:
//	int _leg;
//	int _mouth;
//	bool _canGuardHouse​​ = true;
//};

class Animal
{
public:
protected:
	int _leg;
	int _mouth;
};
class Cat : public Animal
{
public:
private:
	bool ​​_canClimbWalls = true;//bool类型在x86与x64下均占1字节
};
class Dog : public Animal
{
public:
private:
	bool _canGuardHouse​​ = true;
};

class A
{
public:
	double _a;
	char _b;
};
class B : public A
{
public: 
	char _c;
	int _d;
	char _e;
};
void test1()
{
	cout << sizeof(A) << endl;//16
	cout << sizeof(B) << endl;//32
	B s;
	printf("_a: %p\n_b: %p\n_c: %p\n_d: %p\n_e: %p\n", &s._a, &s._b, &s._c, &s._d, &s._e);
//_a: 0000002D6ECFF6A8
//_b: 0000002D6ECFF6B0
//_c: 0000002D6ECFF6B8
//_d: 0000002D6ECFF6BC
//_e: 0000002D6ECFF6C0
	//分析：_a为double类型，占用前八个字节，_b为char类型，占用第九个字节，此时父类成员全部存放，计算父类整体所占内存，即9 < 8 * 2 = 16，所以父类占据16
	//之后，_c为char类型，第17字节，_d为int类型，需要内存对齐至第20字节，20 + 4 = 24，然后存放e到25，最后查找父类与子类中成员所占内存最大值（这里是double占8字节）
	//然后8 * 3 < 25 < 8 * 4，所以B占据32个字节
}
template<class T>
class vector
{
public:
	vector(const T& a = T())
	{
		cout << "vector(const T& a)" << endl;
	}
};

template<class T>//由于要继承类模板，所以子类也需要是类模板
class stack : public vector<T>
{
public:
	stack()
	{
		cout << "stack()" << endl;
	}
};
void test2()
{
	stack<int> st;
}
//注：显式写出构造函数，单位显式写出拷贝构造函数时，编译器仍然会自动生成拷贝构造函数
int main()
{
	//test1();
	test2();
	return 0;
}